home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #6 / Amiga Plus CD - 1996 - No. 06.iso / pd / programmierung / proasm / examples / fortune / fortune.s < prev    next >
Text File  |  1996-04-12  |  7KB  |  323 lines

  1. ;-------------------------------------------------------------------------------
  2. *                                                                              *
  3. * Fortune       - small fortune teller                                         *
  4. *                                                                              *
  5. * Written 1992 by Daniel Weber                                                 *
  6. * Written using the ProAsm assembler                                           *
  7. *                                                                              *
  8. *                                                                              *
  9. *       Filename        fortune.s                                              *
  10. *       Author          Daniel Weber                                           *
  11. *       Version         0.94                                                   *
  12. *       Start           22.11.1992                                             *
  13. *                                                                              *
  14. *       Last Revision   08.08.1993                                             *
  15. *                                                                              *
  16. ;-------------------------------------------------------------------------------
  17. *                                                                              *
  18. * Notes:                                                                       *
  19. *       - '##' indicates the start/end of a text                               *
  20. *       - max. 65535 texts per file allowed (limited by the 'randomizer')      *
  21. *    - '#*' indicates the end of such a fortune file                        *
  22. *                                                                              *
  23. ;-------------------------------------------------------------------------------
  24.  
  25.     output    'ram:fortune'
  26.  
  27.     opt    o+,q+,ow-,sw-
  28.     verbose
  29.     base    progbase
  30.  
  31.     filenote "Fortune, written 1992 by Daniel Weber"
  32.  
  33. ;-------------------------------------------------------------------------------
  34.  
  35.     incdir    'include:'
  36.     incdir    'routines:'
  37.  
  38.     include    'basicmac.r'
  39.     include    'support.mac'        ;some of the support routines
  40.     incequ    'LVO.s'
  41.  
  42. ;-------------------------------------------------------------------------------
  43.  
  44. version        equr    "0.94"
  45. gea_progname    equr    "Fortune"
  46.  
  47.  
  48. cws_CLIONLY    equ    1
  49. cws_EASYLIB    equ    1
  50.  
  51.  
  52. AbsExecBase    equ    4
  53. DOS.LIB        equ    1
  54.  
  55.  
  56. ;-------------------------------------------------------------------------------
  57. progbase:
  58.     jmp    AutoDetach(pc)
  59.     dc.b    0,"$VER: ",gea_progname," ",version," (",__date2,")",0
  60.     even
  61.  
  62. ;----------------------------
  63. clistartup:
  64.     lea    progbase(pc),a5
  65.     move.l    a0,cmdline(a5)
  66.     move.l    d0,cmdlen(a5)
  67.  
  68.     move.l    cmdline(a5),a0
  69.     lea    filename(pc),a1
  70.     move.l    #160,d0            ;maximal file length
  71.     CALL_    ParseName
  72.  
  73.     lea    filename(pc),a0
  74.     tst.w    (a0)
  75.     beq    usage
  76.     cmp.w    #"?"<<8,(a0)
  77.     beq    usage
  78.     move.l    a0,d0
  79.     moveq    #0,d1
  80.     moveq    #0,d2
  81.     CALL_    LoadFile
  82.     move.l    d0,TextAdr(a5)
  83.     beq    fileerror
  84.     move.l    d2,TextLength(a5)
  85.  
  86.     bsr    main
  87.  
  88.     move.l    TextAdr(pc),a1
  89.     move.l    TextLength(pc),d0
  90.     move.l    4.w,a6
  91.     jsr    _LVOFreeMem(a6)
  92.  
  93. exit:    moveq    #0,d0
  94.     bra    ReplyWBMsg
  95.  
  96.  
  97.  
  98. usage:    lea    UsageText(pc),a0
  99.     bsr    PrintTexts
  100.     bra.s    exit
  101.  
  102.  
  103. UsageText:
  104.     dc.b    $9b,"1mFortune v",version,$9b,"0m - "
  105.     dc.b    "Written 1992 by Daniel Weber",$a
  106.     dc.b    "Usage: fortune <text file>",$a,0
  107.     even
  108. ;
  109. ; fortune file not found
  110. ;
  111. fileerror:
  112.     bsr    wrongfile
  113.     bra    exit
  114.  
  115.  
  116. ;----------------------------------------------------------
  117. *
  118. * a0: text to print
  119. *
  120. PrintTexts:
  121.     movem.l    d0-a6,-(a7)
  122.     move.l    a0,d2
  123.     move.l  d2,a3
  124. .loop:    tst.b   (a3)+            ;search end of string
  125.     bne.s   .loop
  126.     move.l  a3,d3
  127.     subq.l  #1,d3
  128.     sub.l   d2,d3            ;length
  129.     beq.s   .nothingtowrite
  130.     move.l  DosBase(pc),a6
  131.     jsr    _LVOOutput(a6)
  132.     move.l    d0,d1
  133.     beq.s    .nothingtowrite
  134.     jsr     _LVOWrite(a6)
  135. .nothingtowrite:
  136.     movem.l    (a7)+,d0-a6
  137.     rts
  138.  
  139.  
  140. ;---------------------------------------------------------------------
  141. *
  142. * main()
  143. *
  144. * d0: text addr
  145. * d1: filelength
  146. * d2: block length
  147. *
  148. main:    moveq    #0,d5
  149.     moveq    #"#",d6            ;text start indicator
  150.     move.l    d1,d7
  151.     move.l    d0,a0
  152.  
  153. \count:    cmp.b    (a0)+,d6        ;"##" indicates a start of a text...
  154.     beq.s    \found
  155. \db0:    subq.l    #1,d7
  156.     bne.s    \count
  157. 1111$:    tst.l    d5
  158.     bne.s    \random
  159.     bra    wrongfile
  160.  
  161. \found:    cmp.b    #"*",(a0)
  162.     beq.s    1111$
  163.     cmp.b    (a0),d6
  164.     bne.s    \count
  165.     addq.l    #1,a0
  166.     addq.l    #1,d5            ;one text more
  167.     bra.s    \db0
  168.  
  169. ;------------------
  170. \random:
  171.     cmp.l    #$ffff,d5        ;maximal #of texts per file
  172.     bgt    wrongfile
  173.  
  174.     movem.l    d0-d2/d5,-(a7)
  175.     mea    date(pc),d1
  176.     move.l    DosBase(pc),a6
  177.     jsr    _LVODateStamp(a6)
  178.  
  179.     move.l    date+8(pc),d3        ;get
  180.     add.l    d3,d3
  181.     add.l    date+4(pc),d3
  182.     add.l    d3,d3
  183.     add.l    date(pc),d3
  184.     eor.l    #$eb2d367a,d3
  185.     move.l    d3,-(a7)
  186.  
  187.     lea    gfxname(pc),a1
  188.     move.l    4.w,a6
  189.     jsr    _LVOOldOpenLibrary(a6)
  190.     beq.s    12$
  191.     move.l    d0,a6
  192.     jsr    _LVOVBeamPos(a6)
  193.     move.l    d0,d7
  194.     lsl.l    #3,d7
  195.     jsr    _LVOVBeamPos(a6)
  196.     add    d0,d7
  197.     move.l    d7,-(a7)
  198.     move.l    a6,a1
  199.     move.l    4.w,a6
  200.     jsr    _LVOCloseLibrary(a6)
  201.  
  202.     movem.l    (a7),d0/d3
  203.     mulu    d0,d3
  204.  
  205. 12$:    addq.l    #8,a7
  206.     movem.l    (a7)+,d0-d2/d5
  207.     move.l    d5,d4
  208.     mulu    d3,d5
  209.     swap    d5
  210.     and.l    #$ffff,d5        ;text number
  211.     cmp.l    d5,d4
  212.     bgt.s    1$
  213.     exg    d5,d4
  214.  
  215.  
  216. ;------------------
  217. ;
  218. ; d5: text number
  219. ;
  220. 1$:    moveq    #"#",d6            ;text start indicator
  221.     move.l    d1,d7
  222.     move.l    d0,a0
  223.     addq.l    #1,d5            ;for first text
  224.  
  225. \count2:
  226.     cmp.b    (a0)+,d6        ;"##" indicates a start of a text...
  227.     beq.s    \found2
  228. \db2:    subq.l    #1,d7
  229.     bne.s    \count2
  230.     moveq    #1,d5            ;well, take the first text
  231.     bra.s    1$
  232.  
  233. \found2:
  234.     cmp.b    #"*",(a0)
  235.     beq.s    11$
  236.     cmp.b    (a0),d6
  237.     bne.s    \count2
  238.     addq.l    #1,a0
  239.     subq.l    #1,d5            ;one text more
  240.     bne.s    \db2
  241.  
  242. 11$:    move.b    (a0)+,d0        ;search to the end of the '##' line
  243.     beq.s    2$
  244.     cmp.b    #$a,d0
  245.     dbeq    d7,11$
  246.  
  247. ;------------------
  248. ;
  249. ;a0: text to print...
  250. ;
  251. 2$:    move.l    a0,a1
  252.     tst.l    d7
  253.     ble.s    \gottext
  254. \count3:
  255.     cmp.b    (a0)+,d6        ;"##" indicates a start of a text...
  256.     beq.s    \found3
  257.     subq.l    #1,d7
  258.     bne.s    \count3
  259.     bra.s    \gottext
  260.  
  261. \found3:
  262.     cmp.b    #"*",(a0)
  263.     beq.s    222$
  264.     cmp.b    (a0),d6
  265.     bne.s    \count3
  266. 222$:    subq.l    #1,a0
  267.  
  268. ;------------------
  269. \gottext:
  270.     move.l  a1,d2            ;take text pointer
  271.     move.l  a0,d3
  272.     sub.l   a1,d3            ;length
  273.     ble.s   .nothingtowrite
  274.     move.l  DosBase(pc),a6
  275.     jsr    _LVOOutput(a6)
  276.     move.l    d0,d1
  277.     beq.s    .nothingtowrite
  278.     jsr     _LVOWrite(a6)
  279. .nothingtowrite:
  280.     rts
  281.  
  282.  
  283. ;------------------
  284. wrongfile:
  285.     print_    <"Fortune: file error (or not a valid fortune file)!",$a>
  286.     rts
  287.  
  288.  
  289. ;------------------------------------------------------------------------------
  290. *
  291. * routines
  292. *
  293.     include    startup4.r
  294.     include    dosfile.r
  295.  
  296.  
  297. ;--------------------------------------------------------------------
  298. *
  299. * Datas
  300. *
  301. gfxname:    dc.b    "graphics.library",0    ;for VBeamPos()
  302.         even
  303.  
  304. ;--------------------------------------------------------------------
  305. *
  306. * DX section
  307. *
  308. dosbase:    dx.l    1
  309.  
  310. date:        dx.l    3        ;for date stamp
  311.  
  312. cmdline:    dx.l    1        ;command line
  313. cmdlen:        dx.l    1        ;command line length
  314.  
  315. TextAdr:    dx.l    1        ;memory block addr
  316. TextLength:    dx.l    1        ;length of the block
  317.  
  318. filename:    dx.b    162
  319.  
  320.     end
  321.  
  322.  
  323.